<?php

namespace app\service;

class OrderNumberGenerator
{
    private static $lastMicrotime = 0;
    private static $counter = 0;

    public static function generate($machineId = 1)
    {
        // 时间戳（到微秒）17位
        $microtime = microtime(true);
        $timePart = str_pad(str_replace('.', '', sprintf('%.6f', $microtime)), 17, '0', STR_PAD_RIGHT);

        // 确保同一微秒内生成多个号时不重复
        if (self::$lastMicrotime === $microtime) {
            self::$counter++;
        } else {
            self::$lastMicrotime = $microtime;
            self::$counter = 0;
        }

        // 本地进程内计数器（5位）
        $counterPart = str_pad(self::$counter % 100000, 5, '0', STR_PAD_LEFT);

        // 机器 ID（最多支持 999 台机器）3位
        $machinePart = str_pad($machineId % 1000, 3, '0', STR_PAD_LEFT);

        // 随机尾部（5位）确保无重复
        $randomPart = str_pad(mt_rand(0, 99999), 5, '0', STR_PAD_LEFT);

        // 组合成 30 位
        return $timePart . $counterPart . $machinePart . $randomPart;
    }
}
